package top.jiangqiang.crawler.core.config;

import lombok.Data;
import okhttp3.logging.HttpLoggingInterceptor;
import org.dromara.hutool.core.util.RandomUtil;
import top.jiangqiang.crawler.core.constants.BodyMergeStrategy;
import top.jiangqiang.crawler.core.constants.HeaderMergeStrategy;
import top.jiangqiang.crawler.core.constants.QueryParameterMergeStrategy;
import top.jiangqiang.crawler.core.entities.Crawler;
import top.jiangqiang.crawler.core.http.entities.*;
import top.jiangqiang.crawler.core.http.entities.body.HttpBody;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.function.Supplier;

@Data
public class GlobalCrawlerConfig implements HttpRequestEntity {
    /**
     * 如果当前种子没有配置，则使用此配置
     */
    private RequestLine requestLine;
    private QueryParameters queryParameters;
    private RequestHeader requestHeader;
    private HttpBody<?> requestBody;
    /**
     * null则不使用代理，可以根据不同爬虫获取不同代理
     */
    private Function<Crawler, ProxyConfig> proxyConfigFunction;
    /**
     * 负责任务调度请求的线程池线程数量
     */
    private int requestThreads = 10;
    /**
     * 负责处理请求结果的线程池线程数量
     */
    private int processingThreads = 20;
    /**
     * 每次发送请求的间隔时间（毫秒）的提供器，用于控制发送请求的频率。 默认情况下，它会在300到1000之间的随机间隔时间内发送请求。
     */
    private Supplier<Long> timeIntervalSupplier = () -> RandomUtil.randomLong(300, 1000);
    /**
     * 初始种子，每次重启程序都会执行这里。如果希望初始种子也只执行一次，可以使用
     * @see top.jiangqiang.crawler.core.recorder.RecorderService#push(List)
     */
    private List<Crawler> seeds = new ArrayList<>();
    /**
     * header的合并策略
     */
    private HeaderMergeStrategy headerStrategy = HeaderMergeStrategy.MERGE;
    /**
     * body的合并策略
     */
    private BodyMergeStrategy bodyStrategy = BodyMergeStrategy.MERGE;
    /**
     * body的合并策略
     */
    private QueryParameterMergeStrategy queryParameterMergeStrategy = QueryParameterMergeStrategy.MERGE;

    /**
     * 是否允许任务结束，如果为false，当没有爬虫任务时会定期轮训检查是否有新的种子，
     * 如果种子来源不仅仅是此程序，建议设置为false
     * 如果为true，则会在一段时间后结束程序
     */
    private Boolean allowEnd = true;

    /**
     * 获取种子超时时间，毫秒
     */
    private Long getTaskTimeout = 60000L;

    /**
     * 日志级别
     */
    private HttpLoggingInterceptor.Level logLevel = HttpLoggingInterceptor.Level.BASIC;
}
